package com.hb.G_协程.A_协程基础

import kotlinx.coroutines.*

/**
 * 延迟一段时间来等待另一个协程运行并不是一个好的选择。
 * 让我们显式（以非阻塞方式）等待所启动的后台 Job 执行结束：
 */
fun main() = runBlocking {
    val job = GlobalScope.launch { // 启动一个新协程并保持对这个作业的引用
        delay(1000L)
        println("World!")
    }
    println("Hello,")
    //现在，结果仍然相同，但是主协程与后台作业的持续时间没有任何关系了。好多了。
    //一直等待到协程的执行完

    //不会将当前的线程挂起
    println(Thread.currentThread().name+"\t线程 do something...")

    job.join() // 等待直到子协程执行结束
    println("ending...")

    /**
     * 输出：
     *  Hello,
     *  World!
     *
     *  解析：在上面的代码中，我们的job,假设不知道该操作会执行多久，所以我们在程序的最后增加了：job.join()
     *  这样程序就会一直等待，知道我们启动的写好才能结束。注意，这里的等待是非阻塞式的等待，不会将当前的线程挂起。
     *
     *  有时也需要给程序定时，比如我们不需要某个IO操作执行很长的时间，超过一定的时间之后，就报超时的错误，在这种
     *  情况下我们就不必使用join.
     *
     *  suspend修饰的方法在协程内部去执行。
     */
}